package PenTest.Soluation6;
import java.util.*;


/**
 * Created with IntelliJ IDEA.
 * Description:
 * User:周次煜
 * Date: 2024-07-20
 * Time：13:19
 */
public class Test {
}


/**
 * 题目： 链表相加（2）
 *
 * 1. 先把给出的两个链表进行逆置
 * 2. 创建一个新的链表，一边存数据总和的第一位，一边进行下一位的存储
 * 3. 注意只有链表没遍历完 或者 下一位还有值 我们才连接。
 * 4. 最后将我们得到的链表进行 逆置回去 。
 *
 */



   class ListNode {
    int val;
    ListNode next = null;
    public ListNode(int val) {
      this.val = val;
    }
  }


 class Solution {

    public ListNode addInList (ListNode head1, ListNode head2) {

        ListNode newHead1 =  reverseList(head1);
        ListNode newHead2 =  reverseList(head2);

        // 作为新链表的头
        ListNode newHead = new ListNode(0);
        ListNode cur = newHead;
        while (newHead1 != null && newHead2 != null) {
            // 得到这一位的总和
            int sum = newHead1.val + newHead2.val + cur.val;
            cur.val = sum % 10;
            ListNode tmp;

            // 如果总和大于十
            if (sum >= 10) {
                // 下一位就加一
                tmp = new ListNode(1);

            } else {
                // 否则仍然为 0
                tmp = new ListNode(0);
            }


            // 连接下一位
            // 并且都向后走

            newHead1 = newHead1.next;
            newHead2 = newHead2.next;

            if (!(newHead1 == null && newHead2 == null ) || tmp.val ==1) {
                cur.next = tmp;
                cur = cur.next;
            }

        }


        // 如果 第一个链表遍历结束
        while (newHead1 != null) {

            int sum =  newHead1.val + cur.val;
            cur.val = sum % 10;
            ListNode tmp;
            if (sum >= 10) {
                tmp = new ListNode(1);

            } else {
                tmp = new ListNode(0);
            }


            newHead1 = newHead1.next;

            if (!(newHead1 == null && newHead2 == null ) || tmp.val ==1) {
                cur.next = tmp;
                cur = cur.next;
            }
        }

        // 如果 第二个链表遍历结束
        while (newHead2 != null) {

            int sum =  newHead2.val + cur.val;
            cur.val = sum % 10;
            ListNode tmp;
            if (sum >= 10) {
                tmp = new ListNode(1);

            } else {
                tmp = new ListNode(0);
            }



            newHead2 = newHead2.next;

            if (!(newHead1 == null && newHead2 == null ) || tmp.val ==1) {
                cur.next = tmp;
                cur = cur.next;
            }
        }

        ListNode ret = reverseList(newHead);




        return ret;
    }

    public ListNode  reverseList(ListNode root) {

        ListNode newHead = null;
        ListNode cur = root;
        while (root != null) {
            root = root.next;
            cur.next = newHead;
            newHead = cur;
            cur = root;
        }





        return newHead;
    }
}


/**
 * 题目： 链表想加
 *
 * 1. 创建一个新的链表，一边存数据总和的第一位，一边进行下一位的存储
 *
 * 2. 注意只有链表没遍历完 或者 下一位还有值 我们才连接。
 *
 */

 class Solution4 {



    public ListNode ListAdd (ListNode head1, ListNode head2) {


        // 作为新链表的头
        ListNode newHead = new ListNode(0);
        ListNode cur = newHead;

        while (head1 != null && head2 != null) {
            // 得到这一位的总和
            int sum = head1.val + head2.val + cur.val;
            cur.val = sum % 10;
            ListNode tmp;

            // 如果总和大于 10
            if (sum >= 10) {
                // 下一位就加 1
                tmp = new ListNode(1);

            } else {
                // 否则仍然为 0
                tmp = new ListNode(0);
            }


            // 连接下一位
            // 并且都向后走

            head1 = head1.next;
            head2 = head2.next;


            if (!(head1 == null && head2 == null ) || tmp.val ==1) {
                cur.next = tmp;
                cur = cur.next;
            }

        }


        // 如果 第一个链表遍历结束
        while (head1 != null) {

            int sum =  head1.val + cur.val;
            cur.val = sum % 10;
            ListNode tmp;
            if (sum >= 10) {
                tmp = new ListNode(1);

            } else {
                tmp = new ListNode(0);
            }


            head1 = head1.next;

            if (!(head1 == null && head2 == null ) || tmp.val ==1) {
                cur.next = tmp;
                cur = cur.next;
            }
        }

        // 如果 第二个链表遍历结束
        while (head2 != null) {

            int sum =  head2.val + cur.val;
            cur.val = sum % 10;
            ListNode tmp;
            if (sum >= 10) {
                tmp = new ListNode(1);

            } else {
                tmp = new ListNode(0);
            }



            head2 = head2.next;

            if (!(head1 == null && head2 == null ) || tmp.val ==1) {
                cur.next = tmp;
                cur = cur.next;
            }
        }






        return newHead;
    }
}